package com.mojito.learn.design.patterns;

/**
 * 抽象工厂模式
 * <p>
 * 抽象工厂模式创建的是对象家族，也就是很多对象而不是一个对象，并且这些对象是相关的，也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象，这和抽象工厂模式有很大不同。
 * <p>
 * 适合同一主题有多个类型的对象需要创建，定义好抽象工厂，多个抽象方法返回多个抽象类型，多个具体工厂继承抽象工厂，创建具体对象。
 *
 * @author liufq
 * @since 2022/1/26 上午10:27
 */
public class AbstractFactoryPattern {

    public static void main(String[] args) {
        AbstractFactory abstractFactory = new ConcreteFactory1();
        AbstractProductA productA = abstractFactory.createProductA();
        AbstractProductB productB = abstractFactory.createProductB();
        // do something with productA and productB
    }

    public static class AbstractProductA {
    }

    public static class AbstractProductB {
    }

    public static class ProductA1 extends AbstractProductA {
    }

    public static class ProductA2 extends AbstractProductA {
    }

    public static class ProductB1 extends AbstractProductB {
    }

    public static class ProductB2 extends AbstractProductB {
    }

    public static abstract class AbstractFactory {

        abstract AbstractProductA createProductA();

        abstract AbstractProductB createProductB();
    }

    public static class ConcreteFactory1 extends AbstractFactory {
        AbstractProductA createProductA() {
            return new ProductA1();
        }

        AbstractProductB createProductB() {
            return new ProductB1();
        }
    }

    public static class ConcreteFactory2 extends AbstractFactory {
        AbstractProductA createProductA() {
            return new ProductA2();
        }

        AbstractProductB createProductB() {
            return new ProductB2();
        }
    }
}
